GtkColorPlane: Added construct-only properties to setup the adjustments.
authorTristan Van Berkom <tristanvb@openismus.com>
Fri, 29 Mar 2013 12:34:50 +0000 (21:34 +0900)
committerTristan Van Berkom <tristanvb@openismus.com>
Mon, 8 Apr 2013 12:19:29 +0000 (21:19 +0900)
This allows basic construction of this private type in GtkBuilder script,
so it can be used in the GtkColorEditor UI.

gtk/gtkcolorplane.c

index 33dc0260c4129dc215526ad131c79c08a2ba66e3..3a500115ed066794ae98f81406d2687577b680ea 100644 (file)
@@ -37,6 +37,13 @@ struct _GtkColorPlanePrivate
   GtkPressAndHold *press_and_hold;
 };
 
+enum {
+  PROP_0,
+  PROP_H_ADJUSTMENT,
+  PROP_S_ADJUSTMENT,
+  PROP_V_ADJUSTMENT
+};
+
 G_DEFINE_TYPE (GtkColorPlane, gtk_color_plane, GTK_TYPE_DRAWING_AREA)
 
 static void
@@ -457,6 +464,50 @@ plane_finalize (GObject *object)
   G_OBJECT_CLASS (gtk_color_plane_parent_class)->finalize (object);
 }
 
+static void
+plane_set_property (GObject      *object,
+                   guint         prop_id,
+                   const GValue *value,
+                   GParamSpec   *pspec)
+{
+  GtkColorPlane *plane = GTK_COLOR_PLANE (object);
+  GObject *adjustment;
+
+  /* Construct only properties can only be set once, these are created
+   * only in order to be properly buildable from gtkcoloreditor.ui
+   */
+  switch (prop_id)
+    {
+    case PROP_H_ADJUSTMENT:
+      adjustment = g_value_get_object (value);
+      if (adjustment)
+       {
+         plane->priv->h_adj = g_object_ref_sink (adjustment);
+         g_signal_connect_swapped (adjustment, "value-changed", G_CALLBACK (h_changed), plane);
+       }
+      break;
+    case PROP_S_ADJUSTMENT:
+      adjustment = g_value_get_object (value);
+      if (adjustment)
+       {
+         plane->priv->s_adj = g_object_ref_sink (adjustment);
+         g_signal_connect_swapped (adjustment, "value-changed", G_CALLBACK (sv_changed), plane);
+       }
+      break;
+    case PROP_V_ADJUSTMENT:
+      adjustment = g_value_get_object (value);
+      if (adjustment)
+       {
+         plane->priv->v_adj = g_object_ref_sink (adjustment);
+         g_signal_connect_swapped (adjustment, "value-changed", G_CALLBACK (sv_changed), plane);
+       }
+      break;
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+      break;
+    }
+}
+
 static void
 gtk_color_plane_class_init (GtkColorPlaneClass *class)
 {
@@ -464,6 +515,7 @@ gtk_color_plane_class_init (GtkColorPlaneClass *class)
   GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (class);
 
   object_class->finalize = plane_finalize;
+  object_class->set_property = plane_set_property;
 
   widget_class->draw = plane_draw;
   widget_class->configure_event = plane_configure;
@@ -474,6 +526,33 @@ gtk_color_plane_class_init (GtkColorPlaneClass *class)
   widget_class->key_press_event = plane_key_press;
   widget_class->touch_event = plane_touch;
 
+  g_object_class_install_property (object_class,
+                                   PROP_H_ADJUSTMENT,
+                                   g_param_spec_object ("h-adjustment",
+                                                        "Hue Adjustment",
+                                                        "Hue Adjustment",
+                                                       GTK_TYPE_ADJUSTMENT,
+                                                       G_PARAM_WRITABLE |
+                                                       G_PARAM_CONSTRUCT_ONLY));
+
+  g_object_class_install_property (object_class,
+                                   PROP_S_ADJUSTMENT,
+                                   g_param_spec_object ("s-adjustment",
+                                                        "Saturation Adjustment",
+                                                        "Saturation Adjustment",
+                                                       GTK_TYPE_ADJUSTMENT,
+                                                       G_PARAM_WRITABLE |
+                                                       G_PARAM_CONSTRUCT_ONLY));
+
+  g_object_class_install_property (object_class,
+                                   PROP_V_ADJUSTMENT,
+                                   g_param_spec_object ("v-adjustment",
+                                                        "Value Adjustment",
+                                                        "Value Adjustment",
+                                                       GTK_TYPE_ADJUSTMENT,
+                                                       G_PARAM_WRITABLE |
+                                                       G_PARAM_CONSTRUCT_ONLY));
+
   g_type_class_add_private (class, sizeof (GtkColorPlanePrivate));
 }
 
@@ -484,14 +563,11 @@ gtk_color_plane_new (GtkAdjustment *h_adj,
 {
   GtkColorPlane *plane;
 
-  plane = (GtkColorPlane *) g_object_new (GTK_TYPE_COLOR_PLANE, NULL);
-
-  plane->priv->h_adj = g_object_ref_sink (h_adj);
-  plane->priv->s_adj = g_object_ref_sink (s_adj);
-  plane->priv->v_adj = g_object_ref_sink (v_adj);
-  g_signal_connect_swapped (h_adj, "value-changed", G_CALLBACK (h_changed), plane);
-  g_signal_connect_swapped (s_adj, "value-changed", G_CALLBACK (sv_changed), plane);
-  g_signal_connect_swapped (v_adj, "value-changed", G_CALLBACK (sv_changed), plane);
+  plane = (GtkColorPlane *) g_object_new (GTK_TYPE_COLOR_PLANE,
+                                         "h-adjustment", h_adj,
+                                         "s-adjustment", s_adj,
+                                         "v-adjustment", v_adj,
+                                         NULL);
 
   return (GtkWidget *)plane;
 }